#include <iostream>

#ifndef _CLASSTHROWABLE_
#define _CLASSTHROWABLE_

namespace Exceptions {
 
class Throwable
{
public:
    virtual ~Throwable() throw();
	Throwable();
	Throwable(std::string message);
	Throwable(const Exceptions::Throwable& cause);
	Throwable(std::string message, const Exceptions::Throwable& cause);
	
	std::string getMessage();
	Exceptions::Throwable& getCause();
	Exceptions::Throwable& initCause(const Exceptions::Throwable& cause);

	virtual std::string toString() const;

protected:
	static std::string Description;
	const Exceptions::Throwable* Cause;
	std::string Message;

	void setMessage(std::string message);
};

}//namespace Exceptions

#endif

